#ifndef PANEL_H_
#define PANEL_H_

#include <GL/glut.h>
#include <iostream>

class Panel {
   private:
      Mapa& mapa;
      int w;
      int h;

      int posx;
      int posyArriba;
      int posyAbajo;

      int anchoPanel;
      int altoPanel;

      int separacion;

      editorRevoluciones editorRev;
      editorPerfil editorPerf;

      void dondeClick(int x, int y, int state, bool &clickPanelSuperior, bool &clickPanelInferior) {
         clickPanelSuperior = clickPanelInferior = false;
         if (state != GLUT_UP ) return;

         if ((x > posx) && (x < posx + anchoPanel)) {
            if((y < h - posyArriba) && (y > h - posyArriba - altoPanel)) {
               clickPanelSuperior = true;
            }
            else if( y < (h - posyAbajo) && y > (h - posyAbajo - altoPanel)) {
               clickPanelInferior = true;
            }
         }
      }


      void dibujarEditorCurvas() {
         mapa.dibujarMiniMapa();
         editorRev.dibujarPuntosControl();
      }

      void dibujarEditorPerfiles() {
         editorPerf.dibujarPanelPerfil();
      }

      void setEntorno(bool arriba) {
         glViewport(posx, arriba? posyArriba : posyAbajo, anchoPanel, altoPanel); 

         glMatrixMode (GL_PROJECTION);
         glPushMatrix();
         glLoadIdentity ();
         gluOrtho2D(0, 1,0, 1);

         glMatrixMode(GL_MODELVIEW);
         glPushMatrix();
         glLoadIdentity();
         gluLookAt(0, 0, 0.5, 0, 0, 0, 0, 1, 0);
      }

      void unset() {
         glMatrixMode (GL_PROJECTION);
         glPopMatrix();
         glMatrixMode(GL_MODELVIEW);
         glPopMatrix();
      }

      void fondo() {
         const float radio = 0.03;
         const float xy = radio / 1.47;

         glPushAttrib(GL_ALL_ATTRIB_BITS);
         glEnable(GL_BLEND);
         glBlendFunc(GL_SRC_COLOR, GL_SRC_COLOR);
         glColor4f(0.4, 0.4, 0.4, 0.05);
         
         glBegin(GL_TRIANGLE_FAN);
         glVertex2f(0.5, 0.5);

         glVertex2f(0, radio);
         glVertex2f(xy, xy);
         glVertex2f(radio, 0);

         glVertex2f(1-radio, 0);
         glVertex2f(1-xy, xy);
         glVertex2f(1, radio);
         
         glVertex2f(1, 1-radio);
         glVertex2f(1-xy, 1-xy);
         glVertex2f(1-radio, 1);
         
         glVertex2f(radio, 1);
         glVertex2f(xy, 1-xy);
         glVertex2f(0, 1-radio);

         glVertex2f(0, radio);
         
         glEnd();
         glPopAttrib();
      }

   public:
      Panel(Mapa& mapa, int w_pantalla, int h_pantalla) : 
         mapa(mapa), 
         separacion(5),
         editorRev(&mapa),
         editorPerf(&mapa) { 
            actualizar(w_pantalla, h_pantalla);
         }

      void actualizar(int w_pantalla, int h_pantalla) {
         w=(w_pantalla);
         h=(h_pantalla); 
         anchoPanel=(640*0.2);
         altoPanel=(400*0.4);

         posx=(w-anchoPanel); 
         posyArriba=(h-altoPanel);
         posyAbajo=(h-2*altoPanel) - separacion;

         }

      void editar(int boton,int estado,int x, int y){
         bool enElPanelSuperior; 
         bool enElPanelInferior;

         dondeClick(x, y, estado, enElPanelSuperior, enElPanelInferior); 

         if(enElPanelSuperior){
            if (boton==GLUT_LEFT_BUTTON){
               //Obtencion de las coordenadas normalizadas
               float normaX = float(x - posx) / anchoPanel;
               float normaY = float(y) / altoPanel;

               editorRev.agregarCoordenada(Coord(normaX, normaY, 0));
            }
            if (boton==GLUT_RIGHT_BUTTON){
               editorRev.cerrarCurva();
            }
         }
         else if(enElPanelInferior){
            if (boton==GLUT_LEFT_BUTTON){
               //Obtencion de las coordenadas normalizadas
               float normaX = float(x - posx) / anchoPanel;
               float normaY = float(y - altoPanel - separacion) / altoPanel;

               editorPerf.agregarCoordenada(Coord(normaX, normaY, 0));
            }
            if (boton==GLUT_RIGHT_BUTTON){
               editorPerf.definirPerfil();
            }
         }
      }

      void dibujar() {
         glPushAttrib(GL_ALL_ATTRIB_BITS);
         glPointSize(5);
         glDisable(GL_LIGHTING);
         glDisable(GL_DEPTH_TEST);
         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

         setEntorno(true);
         fondo();
         dibujarEditorCurvas();
         unset();

         setEntorno(false);
         fondo();
         dibujarEditorPerfiles();
         unset();

         glPopAttrib();
         glEnable(GL_LIGHTING);
      }
};
#endif
